package slice

// Index 查找元素下标， 无-1
func Index[T comparable](src []T, dst T) int {
	for k, v := range src {
		if v == dst {
			return k
		}
	}
	return -1
}

// IndexFunc 根据用户需要寻找元素下标， 否则return -1
func IndexFunc[T comparable](src []T, match matchFunc[T]) int {
	for k, v := range src {
		if match(v) {
			return k
		}
	}
	return -1
}

// LastIndex 返回切片中最后一个与dst相等元素的下标
func LastIndex[T comparable](src []T, dst T) int {
	for i := len(src) - 1; i >= 0; i-- {
		if src[i] == dst {
			return i
		}
	}
	return -1
}

// LastIndexFunc 根据用户需要寻找元素下标， 否则return -1
func LastIndexFunc[T comparable](src []T, match matchFunc[T]) int {
	for i := len(src) - 1; i >= 0; i-- {
		if match(src[i]) {
			return i
		}
	}
	return -1
}

// IndexAll 找出相等元素的所有下标
func IndexAll[T comparable](src []T, dst T) []int {
	var indexs = make([]int, 0, len(src))
	for k, v := range src {
		if v == dst {
			indexs = append(indexs, k)
		}
	}
	return indexs
}

// IndexAllFunc  找出相等元素的所有下标, 自定义方式
func IndexAllFunc[T comparable](src []T, match matchFunc[T]) []int {
	var indexs = make([]int, 0, len(src))
	for k, v := range src {
		if match(v) {
			indexs = append(indexs, k)
		}
	}
	return indexs
}
